<?php

  /**
   * ContentController
   *
   * Класс контроллера для подключения внешних ресурсов
   */

  final class ContentController extends XMLController
  {
  // типы изображений
    const IMG_FULL  = "img";
    const IMG_THUMB = "thumb";

    /**
     * Action загрузка ресурса
     *
     * @param string $src имя файла
     * @param string $type тип ресурса
     * @return void
     * @access public
     */
    public function actionIndex($src, $type)
    {
      if ($src && $type)
        self::response($this->fileContent($src, $type), $type);
      else
        $this->baseRedirect();
    }

    /**
     * Action загрузка нескольких ресурсов
     *
     * @param string $files  имена файла, разделенных запятой
     * @param string $folder имя папки с ресурсами
     * @param string $type   тип ресурсов
     * @return void
     * @access public
     */
    public function actionLoad($files, $type, $folder = "")
    {
      if ($files && $type)
      {
        $content = "";
        foreach (explode(",", $files) as $src)
          $content .= $this->fileContent(trim($src), $type, $folder)."\n";
        self::response($content, $type);
      }
      else
        $this->baseRedirect();
    }

    /**
     * Action загрузить изображение на сервер
     *
     * $_POST == array("source" => загружаемый файл)
     *
     * @param string $folder имя папки на сервере
     * @return void
     * @access public
     */
    public function actionImgUpload($folder)
    {
      if (isset($_FILES["source"]) && ($filename = $this->getUploadName($_FILES["source"]["name"], $folder)) && move_uploaded_file($_FILES["source"]["tmp_name"], $filename))
        WebApplication::response(basename($filename));
    }

    /**
     * Action загрузить фотографию на сервер
     *
     * $_POST == array("url" => "ссылка для копирования")
     *
     * @return void
     * @access public
     */
    public function actionPhotoCopy()
    {
      if (($src = $this->getParam("url")) && ($dst = $this->getUploadName($src, "photos")) && copy($src, $dst))
        WebApplication::response(basename($dst));
    }

    /**
     * Action удалить загруженное изображение с сервера
     *
     * $_POST == array("source" => "имя файла")
     *
     * @param string $folder имя папки на сервере
     * @return void
     * @access public
     */
    public function actionImgRemove($folder)
    {
      if ($filename = basename($this->getParam("source")))
        self::imgRemove($folder, $filename);
    }

    /**
     * Action отобразить эскиз
     *
     * @param string $folder имя папки
     * @param string $src    имя файла
     * @param int    $s      размер эскиза
     * @return void
     * @access public
     */
    public function actionThumb($folder, $src, $s = 90)
    {
      /** @var $app WebApplication */
      $app      = $this->app;
      $filename = WebApplication::createPath(array($app->contentPath, self::IMG_FULL, $folder, $src));
      if ($src = self::getThumb($filename, $s))
      {
        header("Content-type: ".image_type_to_mime_type(exif_imagetype($filename)));
        call_user_func("image$src[type]", $src["image"]);
        imagedestroy($src["image"]);
      }
      else
        $this->redirect("$app->contentUrl/$folder/$src");
    }

    /**
     * Action коннектор для ответов на запросы клиента,
     * относящиеся к файловой системе сервера
     * (организация файлового менеджера на стороне клиента)
     *
     * @return void
     * @access public
     */
    public function actionFinder()
    {
      $fm = new elFinder($this->app->fmOptions);
      spl_autoload_unregister(array("YiiBase", "autoload"));
      $fm->run();
      spl_autoload_register(array("YiiBase", "autoload"));
    }

    /**
     * Action получить курсы валют с сайта ЦБ
     *
     * @return void
     * @access public
     */
    public function actionCRBRate()
    {
      $xml = file_get_contents("http://www.cbr.ru/scripts/XML_daily.asp");
      $xml = preg_replace("/^<\?xml(\s+.*?)?\?>/", "", $xml);
      $xml = mb_convert_encoding($xml, "utf-8", "cp1251");
      $this->renderXML($xml, false, $this->getXSLUrl($this->action->id), false);
    }

    /**
     * Action получить информер прогноза погода с сайта gismeteo.ru
     *
     * @param int $id идентификатор города
     * @return void
     * @access public
     */
    public function actionGISMeteo($id)
    {
      self::response(file_get_contents("http://informer.gismeteo.ru/xml/{$id}_1.xml"), "xml");
    }

    /**
     * вернуться на стартовую страницу
     *
     * @return void
     * @access private
     */
    private function baseRedirect()
    {
      $this->redirect($this->app->request->baseUrl);
    }

    /**
     * вернуть содержимое файла
     *
     * @param string $src    имя файла
     * @param string &$type  тип ресурса
     * @param string $folder имя папки с ресурсами
     * @return string
     * @access private
     */
    private function fileContent($src, &$type, $folder = "")
    {
      $pieces = array($this->app->contentPath, $type);
      if ($folder)
        $pieces[] = $folder;
      $path     = WebApplication::createPath($pieces);
      if (!file_exists(WebApplication::createPath(array($path, $src))))
      {
        $path = WebApplication::createPath(array(FRAMEWORK_DIRECTORY, "gii", "assets", $type));
        $type = pathinfo($src, PATHINFO_EXTENSION);
      }
      if (!(defined("YII_DEBUG") && YII_DEBUG))
      {
        $min = WebApplication::createPath(array($path, ".min"));
        if (file_exists(WebApplication::createPath(array($min, $src))))
          $path = $min;
      }
      $src = WebApplication::createPath(array($path, $src));
      return file_exists($src) ? file_get_contents($src) : null;
    }

    /**
     * получить имя файла для загрузки
     *
     * @param string $src    имя загружаемого файла
     * @param string $folder имя папки на сервере
     * @return string
     * @access private
     */
    private function getUploadName($src, $folder)
    {
      $dst  = "";
      $path = WebApplication::createPath(array($this->app->contentPath, self::IMG_FULL, $folder));
      if (file_exists($path) || mkdir($path, 0777, true))
      {
        $tmpname = tempnam($path, $folder);
        $dst     = WebApplication::createPath(array($path, basename($tmpname).".".pathinfo($src, PATHINFO_EXTENSION)));
        @unlink($tmpname);
      }
      return $dst;
    }

    /**
     * удалить загруженное изображение с сервера
     *
     * @param string $folder   имя папки
     * @param string $filename имя файла
     * @return void
     * @access public
     */
    public static function imgRemove($folder, $filename)
    {
      @unlink(WebApplication::createPath(array(Yii::app()->contentPath, self::IMG_FULL, $folder, $filename)));
    }

    /**
     * вернуть эскиз изображения
     *
     * @param string $filename имя файла
     * @param int    $size     размер эскиза
     * @return array
     * @access public
     */
    public static function getThumb($filename, $size = 90)
    {
      if ($src = imagecreatefromext($filename, true))
        if ($dst = imagethumb($src["image"], exif_imagetype($filename), 0, 0, 0, 0, $size, $size))
        {
          imagedestroy($src["image"]);
          $src["image"] = $dst;
        }
      return $src;
    }

    /**
     * ответ сервера
     *
     * @param string $content контент для вывода
     * @param string $type    тип ресурса
     * @return void
     * @access private
     */
    private static function response($content, $type)
    {
      switch ($type)
      {
        case "css"  : $type = "text/css";                 break;
        case "js"   : $type = "application/x-javascript"; break;
        case "xml"  :
        case "xsl"  : $type = "text/xml";                 break;
        case "htm"  :
        case "html" :
        case "shtml":
        case "phtml":
        case "xhtml": $type = "text/html";                break;
        default     : $type = "text/plain";
      }
      WebApplication::response(strval($content), $type);
    }
  }

?>
